#define _CRT_SECURE_NO_WARNINGS

///**
// * Definition for a binary tree node.
// * struct TreeNode {
// *     int val;
// *     struct TreeNode *left;
// *     struct TreeNode *right;
// * };
// */
//
//
//
//bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
//    if (p == NULL && q == NULL)
//    {
//        return true;
//    }
//    if (p == NULL || q == NULL)
//    {
//        return false;
//    }
//    if (p->val != q->val)
//    {
//        return false;
//    }
//
//    return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
//}
//
//
//bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
//
//    if (root == NULL)
//        return false;
//
//    if (isSameTree(root, subRoot))
//        return true;
//
//    return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
//}



#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode
{
    char val;
    struct TreeNode* left;
    struct TreeNode* right;

}TreeNode;


TreeNode* CreatTree(char* a, int* pi)
{

    if (a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }

    TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));

    newnode->val = a[(*pi)++];
    newnode->left = CreatTree(a, pi);
    newnode->right = CreatTree(a, pi);

    return newnode;
}

void  preorder(TreeNode* root)
{
    if (root == NULL)
        return;

    preorder(root->left);
    printf("%c ", root->val);
    preorder(root->right);

}


int main()
{
    char a[100];
    scanf("%s", a);
    int i = 0;
    TreeNode* root = CreatTree(a, &i);
    preorder(root);

    return 0;
}





